package com.cougil.uoc.seghismed.business;

import java.util.List;

import com.cougil.uoc.seghismed.model.Alergia;
import com.cougil.uoc.seghismed.model.Historial;
import com.cougil.uoc.seghismed.model.Pacient;
import com.cougil.uoc.seghismed.model.Usuari;
import com.cougil.uoc.seghismed.model.ciphed.HistorialCiphed;
import com.cougil.uoc.seghismed.model.ciphed.PacientCiphed;

/**
 * Interface que defineix els mètodes oferts a les peticions rebudes a través dels aplicatius dels
 * Pacients. També disposa de la lògica vinculada amb la gestió de la informació relacionada amb els
 * Pacients (ex: grabar, esborrar i cercar Pacients i les seves dades relacionades)
 * 
 * @author Ignacio Cougil Jares
 */

public interface PacientService extends CoreServerService {

	/**
	 * Retorna l'historial del pacient informat signat i xifrat pel destinatari informat
	 *
	 * @param pacientCiphed
	 *            {@link PacientCiphed} pacient xifrat del qual es vol obtenir el seu historial
	 * @param destinatari
	 *            {@link Usuari} usuari destinatari que s'emprarà per signar i xifrar l'historial
	 * @return historial xifrat {@link HistorialCiphed} pel destinatari informat o null en cas que
	 *         no es pugui trobar
	 */
	public HistorialCiphed consultarHistorial(PacientCiphed pacientCiphed, Usuari destinatari);

	/**
	 * Retorna l'historial xifrat només per al gestor associat al pacient xifrat informat
	 *
	 * @param pacient
	 *            {@link PacientCiphed} xifrat pel qual es vol obtenir el seu historial
	 * @return historial {@link Historial} xifrat pel gestor o null en cas que no es pugui trobar
	 */
	public Historial consultarHistorialXifratPelGestor(PacientCiphed pacient);

	/**
	 * Consulta i retorna les dades del pacient i les xifra només per a si mateix
	 *
	 * @param pacient
	 *            {@link PacientCiphed} xifrat del que es preten obtenir la seva informació
	 * @return pacient xifrat {@link PacientCiphed} només per al pacient informat o null en cas que
	 *         no es pugui trobar
	 */
	public PacientCiphed consultarPacient(PacientCiphed pacient);

	/**
	 * Retorna la llista de totes les alergies disponibles en el sistema
	 * @return {@link List} llista amb el conjunt d'elements trobats
	 */
	public List<Alergia> findAlergies();

	/**
	 * Cerca el pacient que tingui el DNI informat
	 * @param dni DNI del pacient que es preten cercar
	 * @return pacient {@link Pacient} trobat
	 */
	public Pacient findByDni(String dni);

	/**
	 * Cerca el pacient que tingui l'identificador informat
	 * @param id Identificador del pacient que es preten cercar
	 * @return pacient {@link Pacient} trobat
	 */
	public Pacient findById (Integer id);

	/**
	 * Cerca l'últim pacient xifrat disponible en el sistema
	 *
	 * @return pacient xifrat {@link PacientCiphed} trobat
	 */
	public PacientCiphed findLastPacientCiphed();

	/**
	 * Retorna el pacient xifrat que representa el pacient informat si aquest es troba dintre del
	 * conjunt de pacients xifrats informat
	 *
	 * @param pacientsXifrats
	 *            {@link List} llista de pacients xifrats sobre els que cercar el pacient informat
	 * @param pacient
	 *            {@link Pacient} pacient a cercar
	 * @return pacient xifrat {@link PacientCiphed} trobat o null en cas contrari
	 */
	public PacientCiphed findPacientCiphed(List<PacientCiphed> pacientsXifrats, Pacient pacient);

	/**
	 * Retorna el pacient xifrat associat al pacient
	 *
	 * @param pacient
	 *            {@link Pacient} del que es preten cercar el seu pacient xifrat
	 * @return pacient xifrat trobat {@link PacientCiphed} o null en cas contrari
	 */
	public PacientCiphed findPacientCiphed(Pacient pacient);

	/**
	 * Retorna la llista de tots els pacients disponibles en el sistema
	 *
	 * @return {@link List} llista amb el conjunt d'elements trobats
	 */
	public List<Pacient> findPacients();

	/**
	 * Retorna la llista amb tots els pacients xifrats disponibles en el sistema
	 *
	 * @return {@link List} llista amb el conjunt d'elements trobats
	 */
	public List<PacientCiphed> findPacientsCiphed();

	/**
	 * Esborra un pacient informat per paràmetre
	 *
	 * @param id
	 *            Identificador del pacient que es preten esborrar
	 */
	public void remove(Integer id);

	/**
	 * Esborra tots els pacients existents en el sistema
	 *
	 * @return nombre de pacients esborrats
	 */
	public int removeAll();

	/**
	 * Emmagatzema un pacient informat per paràmetre i també el seu homònim signat i xifrat pel
	 * Gestor
	 *
	 * @param pacient
	 *            {@link Pacient} que es preten guardar
	 */
	public void save(Pacient pacient);

	/**
	 * Retorna el nombre de pacients xifrats disponibles en el sistema
	 *
	 * @return el nombre d'elements trobats
	 */
	public long totalPacientsCiphed();

}






